import { GeneraDataType } from "@/interface";
import { initGlobalState, MicroAppStateActions } from "qiankun";

// 由于 qiankun3.x版本将 废弃initGlobalState API 所以这里自己封装一个发布订阅者模式来监听同步父子应用的共享数据
// 如果 废弃之后可以直接替换为globalStateMode这个方法、用法和 initGlobalState 方法一样。更新成本最小化

export function globalStateMode(state: GeneraDataType) {
  const listers = new Set();
  const targetValue = {
    value: state
  };
  const globalState = new Proxy(targetValue, {
    set(obj: any, prop: string | symbol, value: any, preValue: any): boolean {
      listers.forEach((callBack: any) => {
        callBack(value, preValue);
      });
      return Reflect.set(obj, prop, value);
    }
  });
  return {
    // 订阅者
    onGlobalStateChange(lister: () => void) {
      listers.add(lister);
      return () => listers.delete(lister);
    },
    offGlobalStateChange() {
      listers.clear();
    },
    setGlobalState(newValue: any) {
      globalState.value = newValue;
    }
  };
}
// 初始化 state
const actions: MicroAppStateActions = initGlobalState({
  cachePageList: []
});
//state: any, prev: any
actions.onGlobalStateChange(() => {
  // state: 变更后的状态; prev 变更前的状态
  // console.log("主应用监听到==>", state, prev);
});

export default actions;
